<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="shortcut icon" href="https://newsblur.com/media/img/favicon.ico" type="image/png" />
  <link rel="icon" href="https://newsblur.com/media/img/favicon_32.png" sizes="32x32"/>
  <link rel="icon" href="https://newsblur.com/media/img/favicon_64.png" sizes="64x64"/>
  <link rel="alternate" type="application/rss+xml" 
  title="The NewsBlur Blog RSS feed" 
  href="/feed.xml" /><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Page 10 of 11 for The NewsBlur Blog | A new sound of an old instrument</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="The NewsBlur Blog" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument." />
<meta property="og:description" content="NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument." />
<link rel="canonical" href="https://blog.newsblur.com/page10/" />
<meta property="og:url" content="https://blog.newsblur.com/page10/" />
<meta property="og:site_name" content="The NewsBlur Blog" />
<meta property="og:type" content="website" />
<link rel="prev" href="https://blog.newsblur.com/page9" />
<link rel="next" href="https://blog.newsblur.com/page11" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="The NewsBlur Blog" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","description":"NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.","headline":"The NewsBlur Blog","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://blog.newsblur.com/assets/newsblur_logo_512.png"}},"url":"https://blog.newsblur.com/page10/"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/main.css">
  <link rel="stylesheet" type="text/css" href="https://cloud.typography.com/6565292/711824/css/fonts.css" />
   <link rel="stylesheet" type="text/css" href="https://cloud.typography.com/6565292/731824/css/fonts.css" /><link type="application/atom+xml" rel="alternate" href="https://blog.newsblur.com/feed.xml" title="The NewsBlur Blog" /></head>
<body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="/">
      <div class="site-title-image">
        <img src="/assets/newsblur_logo_512.png">
      </div>
      <div class="site-title-text">The NewsBlur Blog</div>
    </a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="https://www.newsblur.com">Visit NewsBlur ➤</a></div>
      </nav></div>
</header>

<header class="site-subheader" role="banner">

  <div class="wrapper">
    <div class="top">
      NewsBlur is a personal news reader that brings people together to talk about the world.
    </div>
    <div class="bottom">
      A new sound of an old instrument.
    </div>
  </div>

</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper">
        <div class="home">
    <ul class="post-list"><li><span class="post-meta">Oct 29, 2012</span>
        <h3>
          <a class="post-link" href="/2012/10/29/free-newsblur-swag-time/">
            Time for some free NewsBlur swag!
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>That’s right, t-shirts, stickers, buttons, and magnets. I’ve got a whole lot of good stuff to send out, so give me some critical info and I’ll get you hooked up with the latest in startup love.</p>

<p><strong>The t-shirt entry form has been taken down as of Thursday, November 29th. Hopefully you’ve ordered your t-shirt by now.</strong></p>


        </div>
      </li><li><span class="post-meta">Oct 26, 2012</span>
        <h3>
          <a class="post-link" href="/2012/10/26/ios-update-1-6/">
            Extreme makeover: NewsBlur iOS app edition
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>Now that NewsBlur has joined the wonderful world of Android, we’re turning our attention back to the iOS app, with a full-scale feature parity push for the new iPhone 5 and iOS 6. It’s perfect for catching up on your reading when you realize that Apple Maps has sent you to the wrong address. Again.</p>

<p><img src="https://s3.amazonaws.com/static.newsblur.com/blog/iOS%20v1.6%20-%20Folders.png" alt="image" /> <img src="https://s3.amazonaws.com/static.newsblur.com/blog/iOS%20v1.6%20-%20Menus.png" alt="image" /></p>

<p>We’ve tried to incorporate as many of your suggestions as possible, and here are some of the new features you’ll find:</p>

<ul>
  <li>Collapsible folders: Check out folders one at a time (and save your scrolling fingers some work)</li>
  <li>Saved stories: Access all your saved stories from the Web or other devices, and save other stories for later</li>
  <li>Mark stories as unread: For that fresh new-story feeling</li>
  <li>Send stories to Instapaper for reading later, or e-mail them to your friends/enemies</li>
  <li>Share stories on Twitter and Facebook, and crush social-media naysayers who think you’re just telling people what you ate for breakfast</li>
  <li>New app-wide menus: An interface almost as stylish as your new device, and far less vulnerable to breakage and theft</li>
  <li>Bug fixes, improvements, speed-ups, fine-tuning, and other things that aren’t particularly noticeable (but done because we love you)</li>
</ul>

<p>Check out the update, and be sure to let us know if anything isn’t working the way it should. And Android folks, don’t feel left out; an update with bug fixes is in the pipeline, so stay tuned (and thanks for the feedback!).</p>


        </div>
      </li><li><span class="post-meta">Oct 18, 2012</span>
        <h3>
          <a class="post-link" href="/2012/10/18/do-the-robot-the-official-newsblur-android-app-is/">
            Do the robot: the official NewsBlur Android app is here
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>You’ve been bugging us for two years about it, and now it’s finally here: NewsBlur’s expansion to mobile is complete, with our first-ever <a href="http://www.newsblur.com/android">official Android app</a> ready and waiting for your device. Thanks to the gifts of money and time from Y Combinator and the programming prowess of Papermill creator Ryan Bateman (otherwise known as <a href="http://twitter.com/secretsquirrel">@secretsquirrel</a>), you can now join your iOS brethren on the couch with your daily dose of RSS goodness. Level of accompanying smugness is up to you.</p>

<p><img src="https://s3.amazonaws.com/static.newsblur.com/blog/v1%20-%201.png" alt="image" /> <img src="https://s3.amazonaws.com/static.newsblur.com/blog/v1%20-%203.png" alt="image" /> <img src="https://s3.amazonaws.com/static.newsblur.com/blog/v1%20-%203.png" alt="image" /> <img src="https://s3.amazonaws.com/static.newsblur.com/blog/v1%20-%204.png" alt="image" /></p>

<p>The Android app has all the features of the iOS app, including:</p>

<ul>
  <li>All your sites, folders, and friends’ blurblogs</li>
  <li>Speedy downloading of sites and general alacrity of use</li>
  <li>The ability to share and comment on stories on your blurblog</li>
  <li>Direct imports from Google Reader: download the app without ever having to hit the Web to set up an account</li>
  <li>Follow new people, read their shares, and generally expand your knowledge, worldview, and personal magnetism</li>
</ul>

<p>Plus, it has that delicious Android flavor, with half the calories.</p>

<p>Download the official <a href="http://www.newsblur.com/android">NewsBlur Android app</a>. Tell your friends! Tip your waitstaff. Try the veal. Floss twice a day. Call your mom, she misses you.</p>


        </div>
      </li><li><span class="post-meta">Oct 1, 2012</span>
        <h3>
          <a class="post-link" href="/2012/10/01/giving-life-to-popular/">
            Giving Life to &quot;The People Have Spoken&quot;
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>For a long time, we’ve maintained <a href="http://popular.newsblur.com">The People Have Spoken</a>, the blog of what’s popular on NewsBlur, with a simple algorithm that measured how often something was shared. While that’s a great way to see the stuff our users really like (<a href="http://xkcd.com/">Randall Munroe</a> would probably win the NewsBlur equivalent of the Oscar), it makes it harder for everyone to find new stuff that they might not have seen or heard of before. So we’ve decided to throw a human into the mix. I’ll let Allie introduce herself in her own words:</p>

<p><a href="http://alliepape.com"><img src="https://s3.amazonaws.com/static.newsblur.com/blog/BigShot.jpg" alt="image" /></a></p>

<p>Hi, I’m <a href="http://alliepape.com">Allie Pape</a>. I’m a journalist here in San Francisco, and I met Sam when he e-mailed me about <a href="http://www.thebolditalic.com/alliepape/stories/2206-friend-me">an article I wrote about making friends in the city</a>. I love to read and spend most of my day paging through articles on the Internet, so I was excited to use NewsBlur as a way to manage and share my discoveries.</p>

<p>Sam’s given me the keys to the Popular account, so I’m going to be following as many active NewsBlur users as possible, and re-posting 3-4 articles per day that I think are particularly notable. I’ll also sprinkle in some things that I find outside of NewsBlur, if I think they’re interesting enough.</p>

<p>This is an experiment, and since I’m just one person, you will probably find some biases in the kind of stuff I like to post. I prefer long pieces to short, and I definitely have a few areas that are of major interest to me (food, pop culture, feminism and women’s issues, and socioeconomic trends) and a few that aren’t (sports, tech). I’ll try to read outside of my comfort zone when I can, but I can’t promise that I can be all things to all people. The hope is, though, that I can get more people reading NewsBlur, which means Sam can afford to hire other people with different interests to do additional curation for the community. And even if you think my taste is terrible, it’s probably more interesting than seeing the same three or four blogs’ posts over and over again.</p>

<p>If you want to know more about me or have comments or feedback, you can write to me at <a href="mailto:allie@newsblur.com">allie@newsblur.com</a>.</p>

<p>I hope you’ll subscribe to the Popular blurblog, and that I’m able to introduce you to something new and cool you haven’t seen before.</p>


        </div>
      </li><li><span class="post-meta">Sep 5, 2012</span>
        <h3>
          <a class="post-link" href="/2012/09/05/newsblur-ipad-app/">
            Take it to the couch with the NewsBlur iPad app
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>There’s no wrong way to hold an iPad loaded with <a href="http://www.newsblur.com/ipad">the brand new NewsBlur iPad app</a>, provided it’s facing you and turned on.</p>

<p><a href="http://www.newsblur.com/ipad"><img src="https://s3.amazonaws.com/static.newsblur.com/blog/iPad.png" alt="image" title="The NewsBlur iPad app in revealing positions" /></a></p>

<p>This brand new iPad app is not just an accessory to the web. It’s a full blown reading experience. Here are some of the many features now available in the palm of your hands:</p>

<ul>
  <li>All your sites, folders, and friend’s blurblogs</li>
  <li>Super-fast everything, from near-instant downloading of stories to the mouthfeel of the app itself</li>
  <li>Commenting on stories and sharing them on your blurblog</li>
  <li>New users can easily get started by importing directly from Google Reader, so you can tell friends about the app without having them to go the website first</li>
</ul>

<p>The biggest new feature is all about sharing stories with people. Blurblogs, those shared story feeds, are now part of your feed list. And you can expand your network by following more people directly from the app. Following more people means being exposed to stories from sites you may not have even heard of. And because the NewsBlur iPad app is so fast, you can traverse between stories quickly, settling on the ones that look interesting. And better yet, see contribute to a discussion between friends, all on the app.</p>

<p>But wait, there’s more! In fact, there’s a whole lot more, because this is a universal iOS app, which means there’s an iPhone app to boot. Everything you can do on the iPad app is available on the iPhone app.</p>

<p><a href="http://www.newsblur.com/ipad"><img src="https://s3.amazonaws.com/static.newsblur.com/blog/iPhone.png" alt="image" title="NewsBlur iPhone app to boot" /></a></p>

<p>The iPad app and latest version of the iPhone app were built by my good friend Roy. Now that the Y Combinator summer has ended, we wish him well as he’s moving on to pursue his non-news dreams. So long buddy, and thanks for all the hard work this summer. Roy <a href="http://roycyang.tumblr.com/post/30118352382/what-ive-learned-during-my-summer-in-yc">wrote about his impression</a> of Y Combinator and the past summer.</p>

<p>Go <a href="http://www.newsblur.com/ipad">download the NewsBlur iOS app</a> and forget about sitting at your desk.</p>


        </div>
      </li><li><span class="post-meta">Jul 30, 2012</span>
        <h3>
          <a class="post-link" href="/2012/07/30/introducing-blurblogs-roy-and-y-combinator/">
            Introducing Blurblogs, Roy, and Y Combinator
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>What a difference a few months make. NewsBlur was a side-project of mine for two years. In March of this year, <a href="[http://blog.newsblur.com/2021/06/21/2012-03-01-going-full-time.html](http://blog.newsblur.com/2021/06/21/2012-03-01-going-full-time.html)">I committed myself full-time</a> and went from developing NewsBlur almost entirely on the NYC subway to writing code every waking minute of the day. And now there are three big announcements to make. # 1. NewsBlur is now a *social* news reader The big news of the day is that you can now share stories on NewsBlur. When you share a story, your comments and the original story are posted to your blurblog. Your blurblog is a simple and customizable website. People can comment and reply directly on your blurblog, and you can follow your friends to read the news stories and blog posts that they care about.<figure class="tmblr-full" data-orig-height="869" data-orig-width="600" data-orig-src="http://f.cl.ly/items/3e1r202n3I232M473J2b/blurblog%20screenshot.png"><img style="margin: 0 auto;width: 600px; height: 869px; border: 1px solid #A0A0A0" data-orig-height="869" data-orig-width="600" src="http://f.cl.ly/items/3e1r202n3I232M473J2b/blurblog%20screenshot.png" /></figure>Since you’re good at picking your friends, and your friends are good at picking their friends, you will see friends of friends show up, expanding your network with shared stories that you will enjoy. It’s a new way of sharing the news. And because NewsBlur is already an easy to use news reader, it’s simple to find and share stories that your friends will care about. Every NewsBlur user has their own blurblog. All you have to do is signup for an account on <a href="[http://www.newsblur.com](http://www.newsblur.com)">www.newsblur.com</a> and share interesting stories. # 2. Y Combinator For those of you who work with computer science, you may know that a Y-combinator generalizes recursion, abstracting its implementation, and thereby separating it from the actual work of the function in question.[^1] <a href="http://www.ycombinator.com"><figure class="tmblr-full" data-orig-height="81" data-orig-width="500"><img src="https://64.media.tumblr.com/97d36e865086575a3b131e7ec928534e/c3a0661d97716fb7-14/s540x810/172c7f8b8367a623b61a3f26e3d95ff5214b5e2c.png" style="margin: 12px auto;width: 200px;border: none" data-orig-height="81" data-orig-width="500" /></figure></a>I’m pleased as punch to announce an investment in NewsBlur by Y Combinator, the investment firm. Over the past two months, we’ve been humbled by the roster of experienced partners giving us candid advice. It’s their tough love that is the catalyst for the next few months of transitioning NewsBlur from side project to world-class news reader. Expect NewsBlur to become simpler and more refined. # 3. Introducing Roy Yang When Y Combinator accepted me as a solo founder, their first piece of advice was to find a co-founder. Looking at every successful startup, a common pattern emerges. Every great startup has multiple people carrying the load when the company takes off. There is one person on this planet that I would trust as a co-founder. His name is Roy Yang and we have been friends since we met in New York four years ago. We worked together for nearly two years at Daylife, another news startup. I attended his wedding last year in Mexico, and he was the only person I called when I knew I needed somebody talented, focused, and able to complement me on a project that demands enormous time and effort.<a href="http://roy.newsblur.com"><figure class="tmblr-full" data-orig-height="334" data-orig-width="500"><img src="https://64.media.tumblr.com/88d3942183371de8e848da2416f28e29/c3a0661d97716fb7-c9/s540x810/028ee543cc6fd18a9daff3b46fbaaf1408994f25.jpg" style="margin: 12px auto;border: none" data-orig-height="334" data-orig-width="500" /></figure></a>Roy is now responsible for both iOS apps and is instrumental in challenging me when I think I’m right and am clearly not. He’s got the patience of a monk and the determination of a true New Yorker. <a href="[http://roy.newsblur.com](http://roy.newsblur.com)">Follow Roy’s blurblog</a> to keep up with him. # A glimpse into the future of NewsBlur This summer marks the beginning of NewsBlur as a full-time startup. Look forward to new mobile apps, new designs, and new features. Here’s a quick idea of what we’re working on for the next few weeks:</p>

<figure data-orig-height="216" data-orig-width="284"><img src="https://64.media.tumblr.com/976b01805af2f28072b5fda19b03553e/c3a0661d97716fb7-2e/s540x810/3d07b12c76cc63bfcb21cee6d866c27dacd129f0.png" style="clear: none; float: left;margin: 0 24px 24px 0;border: 1px solid #A0A0A0;" data-orig-height="216" data-orig-width="284" /></figure>
<figure data-orig-height="216" data-orig-width="284"><img src="https://64.media.tumblr.com/62efdc1b56ca49a5df863ae0ff79b9af/c3a0661d97716fb7-89/s540x810/1b25ff57ad8c97ee62d3d0f621fde66005f5ffc1.png" style="clear: none; float: left;margin: 0 0 24px 0;border: 1px solid #A0A0A0;" data-orig-height="216" data-orig-width="284" /></figure>
<figure data-orig-height="216" data-orig-width="284"><img src="https://64.media.tumblr.com/aa7923057b5317a73d25d587f52b1a9b/c3a0661d97716fb7-74/s540x810/d09e1cbe95c3915f99a9b7b4e29e73c63fda0f4e.png" style="clear: none; float: left;margin: 0 24px 24px 0;border: 1px solid #A0A0A0;" data-orig-height="216" data-orig-width="284" /></figure>
<figure data-orig-height="216" data-orig-width="284"><img src="https://64.media.tumblr.com/430031fdbde97cfda01b197653885cd6/c3a0661d97716fb7-98/s540x810/97b2fb0e47f2b1cf3a1a69ad3dd6aebae0ec4c2d.png" style="clear: none; float: left;margin: 0 0 24px 0;border: 1px solid #A0A0A0;" data-orig-height="216" data-orig-width="284" /></figure>

<p>Until then, follow <a href="http://twitter.com/newsblur">@newsblur</a> on Twitter and start sharing news and blogs on <a href="http://www.newsblur.com">NewsBlur</a>.</p>

<p>— Samuel Clay, <a href="http://twitter.com/samuelclay">@samuelclay</a></p>


        </div>
      </li><li><span class="post-meta">Apr 2, 2012</span>
        <h3>
          <a class="post-link" href="/2012/04/02/building-real-time-feed-updates-for-newsblur/">
            Building real-time feed updates for NewsBlur with Redis and WebSockets
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>Today, NewsBlur is going real-time. Blogs using the PubSubHubbub protocol (PuSH), which includes all Blogger, Tumblr, and many Wordpress blogs, will instantaneously show new updates to subscribers on NewsBlur. Making this happen, while not for the faint of heart, was straight-forward enough that I’m sharing the recipe I used to get everything hooked up and running smoothly.</p>

<p>Every user, both premium and standard, will now receive instantaneous updates. I’ve been beta-testing this feature for the past few weeks, and I’ve been quite pleased in knowing that I’m now reading on the bleeding-edge.</p>

<p>If you are a developer, you may be interested in how this was done. There are two components in a real-time feed: detecting updates and then informing users of those updates.</p>

<h2 id="get-blog-updates-in-real-time">Get blog updates in real-time</h2>

<p>If you are building a system that consumes an RSS feed and you want it to push to you, you’ll have to subscribe to a special PubSubHubbub hub url that the RSS feed gives you in the original RSS feed.</p>

<p>Take a look at the <code class="language-plaintext highlighter-rouge">&lt;feed&gt;</code> section in the NewsBlur Blog’s RSS feed:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; # Python
&gt;&gt;&gt; from utils import feedparser
&gt;&gt;&gt; from pprint import pprint
&gt;&gt;&gt; fp = feedparser.parse('http://blog.newsblur.com/rss')
&gt;&gt;&gt; pprint(fp.feed)
{'generator': u'Tumblr (3.0; @newsblur)',
 'generator_detail': {'name': u'Tumblr (3.0; @newsblur)'},
 'link': u'http://blog.newsblur.com/',
 'links': [{'href': u'http://tumblr.superfeedr.com/',
            'rel': u'hub',
            'type': u'text/html'},
           {'href': u'http://blog.newsblur.com/',
            'rel': u'alternate',
            'type': u'text/html'}],
 'subtitle': u'Visual feed reading with intelligence.',
 'subtitle_detail': {'base': u'http://blog.newsblur.com/rss',
                     'language': None,
                     'type': u'text/html',
                     'value': u'Visual feed reading with intelligence.'},
 'title': u'The NewsBlur Blog',
 'title_detail': {'base': u'http://blog.newsblur.com/rss',
                  'language': None,
                  'type': u'text/plain',
                  'value': u'The NewsBlur Blog'}}
</code></pre></div></div>

<p>If there’s a <code class="language-plaintext highlighter-rouge">rel="hub"</code> node under <code class="language-plaintext highlighter-rouge">links</code>, then the RSS feed is advertising its PubSubHubbub abilities. If you make a subscription request to that address, then the feed will push out updates to your callback URL.</p>

<p>The code for sending the subscription requests, along with generating the verification token, can be found on GitHub: <a href="http://github.com/samuelclay/NewsBlur/tree/master/apps/push/views.py">the PuSH views for handling updates and the initial callback</a> and <a href="http://github.com/samuelclay/NewsBlur/tree/master/apps/push/models.py">the PuSH models used to store subscriptions in the DB</a>. Here’s the main request that your server has to send:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Python
response = self._send_request(hub, {
    'hub.mode' : 'subscribe',
    'hub.callback' : callback,
    'hub.topic' : topic,
    'hub.verify' : ['async', 'sync'],
    'hub.verify_token' : subscription.generate_token('subscribe'),
    'hub.lease_seconds' : lease_seconds,
})
</code></pre></div></div>

<p>The publisher will then ping your server back to confirm the subscription. Once the publisher is configured to send blog updates to your server, you just have to let users know when there’s a new story, and that’s takes some COMET/push technology with the help of WebSockets.</p>

<h2 id="serving-updates-to-visitors-in-real-time">Serving updates to visitors in real-time</h2>

<p>When a publisher pushes a new story to your server, apart from dupe detection and storing it in your database, you need to alert users who are currently on the site.</p>

<p><a href="http://redis.io">Redis</a> is your new best friend. One of its primary data structures, apart from hashes, sets, sorted sets, and key-value, is a pubsub type that is perfect for this kind of update. Users subscribe to the updates of all of the feeds to which they subscribe. When these sites have a new story, they publish a simple notification to each of the feed’s subscribers.</p>

<p>Here the feed fetcher is publishing to any listening subscribers.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Python
def publish_to_subscribers(self, feed):
    try:
        r = redis.Redis(connection_pool=settings.REDIS_POOL)
        listeners_count = r.publish(str(feed.pk), 'story:new')
        if listeners_count:
            logging.debug(" ---&gt; [%-30s] Published to %s subscribers" % (
                          feed.title[:30], listeners_count))
    except redis.ConnectionError:
        logging.debug(" ***&gt; [%-30s] Redis is unavailable for real-time." % (
                      feed.title[:30],))
</code></pre></div></div>

<p>These subscribers have subscribed via Redis. To know that a user is currently connected and wants to be notified of updates, <a href="http://socket.io">Socket.io</a> is used to connect the browser to a Node.js server that will subscribe to updates via Redis.</p>

<p>The browser opens up a WebSocket and listens for updates for the feeds that they care about:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// JavaScript
setup_socket_realtime_unread_counts: function() {
    if (!this.socket) {
        var server = window.location.protocol + '//' +
                     window.location.hostname + ':8888';
        this.socket = this.socket || io.connect(server);

        this.socket.on('connect', _.bind(function() {
            var active_feeds = this.send_socket_active_feeds();
            console.log(["Connected to real-time pubsub with " + 
                         active_feeds.length + " feeds."]);

            this.socket.on('feed:update', _.bind(function(feed_id, message) {
                console.log(['Real-time feed update', feed_id, message]);
                this.force_feeds_refresh(false, false, parseInt(feed_id, 10));
            }, this));

            this.flags.feed_refreshing_in_realtime = true;
            this.setup_feed_refresh();
        }, this));

        this.socket.on('disconnect', _.bind(function() {
            console.log(["Lost connection to real-time pubsub. Falling back to polling."]);
            this.setup_feed_refresh();
        }, this));
    }
},
</code></pre></div></div>

<p>The app server is ready to handle thousands of concurrent subscription requests, being Node.js and asynchronous:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># CoffeeScript
fs = require 'fs'
io = require('socket.io').listen 8888
redis = require 'redis'

REDIS_SERVER = if process.env.NODE_ENV == 'dev' then 'localhost' else 'db01'
client = redis.createClient 6379, REDIS_SERVER

io.sockets.on 'connection', (socket) -&gt;
    console.log " ---&gt; New connection brings total to" +
                " #{io.sockets.clients().length} consumers."
    socket.on 'subscribe:feeds', (feeds, username) -&gt;
        socket.subscribe?.end()
        socket.subscribe = redis.createClient 6379, REDIS_SERVER

        console.log " ---&gt; [#{username}] Subscribing to #{feeds.length} feeds"
        socket.subscribe.subscribe feeds

        socket.subscribe.on 'message', (channel, message) -&gt;
            console.log " ---&gt; [#{username}] Update on #{channel}: #{message}"
            socket.emit 'feed:update', channel

    socket.on 'disconnect', () -&gt;
        socket.subscribe?.end()
        console.log " ---&gt; [] Disconnect, there are now" +
                    " #{io.sockets.clients().length-1} consumers."
</code></pre></div></div>

<p>That’s all there is to it. There a lot going on, but it’s effectively a small circle composed of subscribers and publishers, using Redis to maintain pubsub connections between the many clients and their many feeds.</p>

<script src="http://yandex.st/highlightjs/6.1/highlight.min.js"></script>
<link rel="stylesheet" type="text/css" href="http://yandex.st/highlightjs/6.1/styles/github.min.css" />

<script type="text/javascript">
  hljs.initHighlightingOnLoad();
</script>


        </div>
      </li><li><span class="post-meta">Mar 16, 2012</span>
        <h3>
          <a class="post-link" href="/2012/03/16/knight-news-challenge/">
            Knight News Challenge: NewsBlur
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p><a href="http://newschallenge.tumblr.com/post/19397311604/newsblur">Knight News Challenge: NewsBlur</a></p>

<p>Hey NewsBlurians, I’m applying for a grant from the Knight Foundation. In a previous life I worked on DocumentCloud, a successful Knight grantee, building <a href="http://www.documentcloud.org/opensource">open-source libraries</a>. I’m looking to continue the fine tradition of building for both users and for other developers.</p>

<p>I’m asking for enough to fund a year of development with the help of another engineer. Please vote for the NewsBlur grant application on Knight’s website, reblogged below.</p>

<p><a href="http://newschallenge.tumblr.com/post/19397311604/newsblur">Knight News Challenge Entry</a>:</p>

<blockquote>
  <h3 id="1-what-do-you-propose-to-do-20-words">1. What do you propose to do? [20 words]</h3>

  <p>To build an intelligent social news reader for web and mobile called NewsBlur.</p>

  <h3 id="2-is-anyone-doing-something-like-this-now-and-how-is-your-project-different-30-words">2. Is anyone doing something like this now and how is your project different? [30 words]</h3>

  <p>RSS feed readers exist, none have the sharing model, original site view, and intelligence classifiers of NewsBlur. Since Google Reader phased out sharing, there’s a sizable community looking to share and discuss news.</p>

  <h3 id="3-describe-the-network-with-which-you-intend-to-build-or-work-50-words">3. Describe the network with which you intend to build or work. [50 words]</h3>

  <p>NewsBlur will surface stories shared by friends and friends of friends by combining the imported networks of Twitter/Facebook with communities on NewsBlur. These communities make it easy to expand your network by showing popular comments from outside your network. NewsBlur also has intelligence classifiers which allow the user to filter and highlight comments across all networks.</p>

  <h3 id="4-why-will-it-work-100-words">4. Why will it work? [100 words]</h3>

  <p>Because it’s worked before, just under a different model in Google Reader’s now defunct all-or-nothing community. NewsBlur’s network will be oriented more towards showing relationships and distance between you and the other active commenters on a story. NewsBlur will capitalize on the value of pre-existing networks with an intuitive and clean interface that highlights the distance between users. Surfacing relative connections between people will result in a more active community and increased engagement between like-minded readers. NewsBlur further benefits newspapers, publishers, and individual writers by showing the original site (including ads and design), as well as encouraging reading through NewsBlur’s intelligence filters.</p>

  <h3 id="5-who-is-working-on-it-100-words">5. Who is working on it? [100 words]</h3>

  <p>I started working on NewsBlur as a side project in June 2009. Over the past 2.5 years, NewsBlur has become self-sustainable through organic growth (word-of-mouth, blog posts, github activity). Because NewsBlur is open-source, a number of contributors from the NewsBlur community have developed their own pet features which have been integrated back into the website. This also works well for finding typos in documentation and allowing users to submit a simple pull request to get it fixed.</p>

  <h3 id="6-what-part-of-the-project-have-you-already-built-100-words">6. What part of the project have you already built? [100 words]</h3>

  <p>On the back-end: distributed feed fetchers and parsers. On the front-end: the feed reader itself, intelligence training, and an iPhone app. There is an actively used API, on top of which NewsBlur’s users have built a mobile website, an Android app, a Windows Phone app, and a Nokia MeeGo app. What’s not built is the entire social layer. A prototype has already been developed to surface any network relationships on comments and shared stories.</p>

  <h3 id="7-how-would-you-sustain-the-project-after-the-funding-expires-50-words">7. How would you sustain the project after the funding expires? [50 words]</h3>

  <p>NewsBlur is free, but there is also a premium subscription that costs between $1 - $3 per month. Users can choose how much they’d like to pay, but that means that NewsBlur is able to pay for its 8 servers. The gap between costs and revenue (also known as profit) is increasing every day.</p>

  <p>Requested amount from Knight News Challenge: $150,000<br />
Expected amount of time required to complete project: 1 year</p>
</blockquote>


        </div>
      </li><li><span class="post-meta">Mar 14, 2012</span>
        <h3>
          <a class="post-link" href="/2012/03/14/mobile-app-web-feeds-nokia-meego/">
            New mobile app for NewsBlur: Web Feeds for Nokia MeeGo
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>And what a gorgeous mobile app it is. App developer Róbert Márki just released <a href="http://store.ovi.com/content/261063">Web Feeds</a>, the first NewsBlur app for Nokia MeeGo. Take a look at these screenshots:</p>

<style>
.nokia td img {
width: 280px;
margin-right: 24px;
}
</style>
<p>&lt;table class=”nokia”&gt;&lt;tr&gt;&lt;td&gt;</p>
<h3 id="feed-list">Feed list</h3>
<p><img src="http://projects.developer.nokia.com/feed_reader/files/newsblur_view.png" alt="" />&lt;/td&gt; &lt;td&gt;</p>
<h3 id="story-list">Story list</h3>
<p><img src="http://projects.developer.nokia.com/feed_reader/files/feed_view.png" alt="" />&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;</p>
<h3 id="story-view">Story view</h3>
<p><img src="http://projects.developer.nokia.com/feed_reader/files/story_view_large_image2.png" alt="" />&lt;/td&gt; &lt;td&gt;</p>
<h3 id="intelligence-training">Intelligence training</h3>
<p><img src="http://projects.developer.nokia.com/feed_reader/files/inteligence_trainer_feed_view.png" alt="" />&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;</p>
<h3 id="adding-a-site">Adding a site</h3>
<p><img src="http://projects.developer.nokia.com/feed_reader/files/add_feed_sheet.png" alt="" />&lt;/td&gt; &lt;td&gt;</p>
<h3 id="intelligence-control">Intelligence control</h3>
<p><img src="http://projects.developer.nokia.com/feed_reader/files/filter_dialog.png" alt="" />&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt;</p>

<p>Just stellar work and it has all the features of the website. Web Feeds is free and <a href="http://store.ovi.com/content/261063">available from the Nokia Store</a>.</p>


        </div>
      </li><li><span class="post-meta">Mar 1, 2012</span>
        <h3>
          <a class="post-link" href="/2012/03/01/going-full-time/">
            From project to profession: going indie on NewsBlur
          </a>
        </h3>
        <div class="post-content e-content" itemprop="articleBody">
          <p>Exactly four months ago, Jason Kottke found my project, <a href="http://www.newsblur.com">NewsBlur</a>, and tweeted:</p>

<blockquote>
  <p>Looking like @<a href="https://twitter.com/newsblur">newsblur</a> is the @<a href="https://twitter.com/pinboard">pinboard</a> of Google’s deliciousing of Reader.</p>

  <p>— Jason Kottke (@jkottke) <a href="https://twitter.com/jkottke/status/131434505947979776">November 1, 2011</a></p>
</blockquote>

<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>In that time, every measure of traffic, paid subscriptions, and community feedback has cleared new heights on my revered munin charts. But I kept my full-time job and only worked on NewsBlur as a side-project, as I have been doing for the past two years.</p>

<p>I’m at a slow but steady trickle of users, enough of whom convert into paying premium subscribers to pay for the increasing number of servers (now costing almost $800/month!). But a vocal support forum and an ever-increasing trickle of payments aren’t what convinced me to dedicate myself full-time to my humble project.</p>

<p>What convinced me is that life’s too short.</p>

<h2 id="the-only-way-to-do-great-work-is-to-love-what-you-do">The only way to do great work is to love what you do</h2>

<blockquote>
  <p>Yesterday was my last day at Tasty Labs. Today is my first day as a full-time indie developer.</p>

  <p>— Samuel Clay (@samuelclay) <a href="https://twitter.com/samuelclay/status/172737665182076928">February 23, 2012</a></p>
</blockquote>

<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>I’m following the better-half of my inner-Jobs and choosing to follow the path of doing what I love to do.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> It’s going to be expensive on my part. There will be no paycheck, health insurance runs out in a few months, and even on an exceptionally good day, premium subscriptions bring in only about half of my former salary.</p>

<h2 id="paying-customers-are-keeping-things-afloat">Paying customers are keeping things afloat</h2>

<p>It’s not that big a risk. Users are choosing to pay and choosing how much to pay. Some users opt to pay a $12/year at a buck a month, while some choose to pay $36/year at $3/month. The servers cost roughly .75x what premium subscriptions bring in. That gap between cost and revenue is growing steadily, as the servers I have are running at 25% capacity.</p>

<p>Maciej Ceglowski, of Pinboard fame, has written extensively about the scourge of free services not taking payments from users. From a recent February 2012 presentation, he <a href="http://pinboard.in/talks/biz.pdf">writes of the three types of services</a> [pdf]:</p>

<blockquote>
  <h3 id="business-model-1-charge-money">Business Model #1: Charge Money</h3>

  <p>This is a groundbreaking new approach where a site accepts fungible tokens of value in return for a product or service.</p>

  <h3 id="business-model-2-burn-money">Business Model #2: Burn Money</h3>

  <p>￼Find a sponsor with deep pockets and run at a loss indefinitely.</p>

  <h3 id="business-model-3-offer-a-free-service-and-fail">Business Model #3: Offer a Free Service and Fail</h3>

  <p>The most popular business model has been to offer a free service and then shut down (or transition to model #1).</p>
</blockquote>

<p>You can look forward to new features, bug fixes, and an unending stream of progress, all because you’re paying me for the work I do. It’s a simple setup that helps me sleep at night. I’m building an honest product. You know what you’re paying for. And NewsBlur will continue to be ad-free, because ads are not part of the product that I want to use myself.</p>

<h2 id="so-much-time-so-little-to-do-strike-that-reverse-it">So much time, so little to do. Strike that! Reverse it.</h2>

<p>In what I can only consider a bizarrely wonderful coincidence, I see this the morning after I declared freedom:</p>

<blockquote>
  <p>@<a href="https://twitter.com/samuelclay">samuelclay</a> Good luck!</p>

  <p>— Google Reader (@googlereader) <a href="https://twitter.com/googlereader/status/173084829880037376">February 24, 2012</a></p>
</blockquote>

<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>The wind’s at my back, and I’m feeling pretty good about this.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>

<hr />

<ol>
  <li></li>
</ol>

<p>The worse-half of my inner-Jobs insists on perfection and never gets anything shipped. The balancing act between better and done is about the only constant in this crazy dream to be a self-sustaining indie dev. <a href="#fnref:1">↩︎</a></p>

<ol>
  <li></li>
</ol>

<p>You should <a href="https://github.com/samuelclay">follow NewsBlur’s development on Github</a>. I live on props, so that’d make me feel even better. <a href="#fnref:2">↩︎</a></p>


        </div>
      </li></ul>

    <!-- Pagination links -->
<div class="pagination">
  
    <a href="/page9" class="previous">
      Previous
    </a>
  
  <span class="page_number ">
    Page: 10 of 11
  </span>
  
    <a href="/page11" class="next">Next</a>
  
</div>

    <p class="rss-subscribe">subscribe <a href="/feed.xml">via RSS</a></p></div>

      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">The NewsBlur Blog</h2>

    <div class="footer-col-wrapper">
      

      <div class="footer-col footer-col-1"><ul class="social-media-list"><li><a href="https://github.com/samuelclay"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">samuelclay</span></a></li><li><a href="https://www.twitter.com/newsblur"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">newsblur</span></a></li><li><a href="mailto:blog@newsblur.com?subject=Hello from the NewsBlur blog"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#email"></use></svg> <span class="username">blog@newsblur.com</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>NewsBlur is a personal news reader that brings people together to talk about the world.<br />
A new sound of an old instrument.<br />
</p>
      </div>
    </div>

  </div>

</footer>
</body>

</html>
